package com.xci.core.helper;

import cn.hutool.core.util.PageUtil;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;

/**
 * 集合操作帮助类
 * @author 吕艳阳
 */
public class CollectionHelper {
    /**
     * 在一个一维数组中搜索指定对象，并返回其首个匹配项的索引。
     *
     * @param array 在一个一维数组中搜索指定对象，并返回其首个匹配项的索引。
     * @param value 要在 array 中查找的对象。
     * @param <T>   数组元素的类型。
     * @return 如果在整个 array 中找到 value 的第一个匹配项，则为该项的从零开始的索引；否则为 -1。
     */
    public static <T> int indexOf(T[] array, T value) {
        if (array == null || array.length == 0) return -1;
        for (int i = 0; i < array.length; i++) {
            T current = array[i];
            if (current.equals(value)) {
                return i;
            }
        }
        return -1;
    }

    /**
     * 列表排序
     * @param pageIndex 页码，从1开始
     * @param pageSize 每页的条目数
     * @param comparator 比较器,可为空
     * @param colls 集合数组
     * @param <T> 集合元素类型
     * @return 分页后的段落内容
     */
    @SafeVarargs
    public static <T> List<T> pageList(int pageIndex, int pageSize, Comparator<T> comparator, Collection<T>... colls) {
        final List<T> result = new ArrayList<>();
        for (Collection<T> coll : colls) {
            result.addAll(coll);
        }

        if (comparator!=null){
            result.sort(comparator);
        }

        int resultSize = result.size();
        // 每页条目数大于总数直接返回所有
        if (resultSize <= pageSize) {
            return result;
        }
        final int[] startEnd = PageUtil.transToStartEnd(pageIndex, pageSize);
        if (startEnd[1] > resultSize) {
            // 越界直接返回空
            return new ArrayList<>();
        }

        return result.subList(startEnd[0], startEnd[1]);
    }
}
